{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Import required packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import matplotlib.image as mpimg\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import sys\n",
    "import os\n",
    "from sklearn.datasets import fetch_mldata\n",
    "import random\n",
    "import cntk as C\n",
    "import cntk.tests.test_utils\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "import argparse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### parameter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Training\n",
    "num_training_samples = 60000 # Number of training samples\n",
    "batch_size = 64 # Number of mini-batch size\n",
    "num_epochs = 10 # Number of epochs of data for training\n",
    "initial_learning_rate = 0.1 # Initial learning rate\n",
    "train_log_iter = 500 # Number of iteration per training log\n",
    "\n",
    "# Architecture parameters\n",
    "feature_dim = (1, 28, 28)    # images are 28 x 28 with 1 channel of color (gray)\n",
    "num_classes = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Required Objects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Define the class for mini-batch reader in random fashion.\n",
    "class Batch_Reader(object):\n",
    "    def __init__(self, data , label):\n",
    "        self.data = data\n",
    "        self.label = label\n",
    "        self.num_sample = data.shape[0]\n",
    "\n",
    "    def next_batch(self, batch_size):\n",
    "        index = random.sample(range(self.num_sample), batch_size)\n",
    "        return self.data[index,:].astype('float64'),self.label[index,:].astype('float64')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Loading Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the data.\n",
    "mnist = fetch_mldata('MNIST original', transpose_data=True)\n",
    "X = mnist.data.reshape((-1 , feature_dim[0],feature_dim[1],feature_dim[2]))\n",
    "y = mnist.target\n",
    "# Create train & test data.\n",
    "train_data = X[:num_training_samples,:]\n",
    "train_label = y[:num_training_samples]\n",
    "test_data = X[num_training_samples:,:]\n",
    "test_label = y[num_training_samples:]\n",
    "\n",
    "# Transform train labels to one-hot style.\n",
    "enc = OneHotEncoder()\n",
    "enc.fit(train_label[:,None])\n",
    "onehotlabels_train = enc.transform(train_label[:,None]).toarray()\n",
    "\n",
    "# Call and create the ``train_reader`` object.\n",
    "train_reader = Batch_Reader(train_data, onehotlabels_train)\n",
    "\n",
    "# Transform test labels to one-hot style.\n",
    "enc = OneHotEncoder()\n",
    "enc.fit(test_label[:,None])\n",
    "onehotlabels_test = enc.transform(test_label[:,None]).toarray()\n",
    "\n",
    "# Call and create the ``test_reader`` object.\n",
    "test_reader = Batch_Reader(test_data, onehotlabels_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Place holders.\n",
    "input = C.input_variable(feature_dim)\n",
    "label = C.input_variable(num_classes)\n",
    "\n",
    "# Creating the architecture\n",
    "def create_model(features):\n",
    "    '''\n",
    "    This function creates the architecture model.\n",
    "    :param features: The input features.\n",
    "    :return: The output of the network which its dimentionality is num_classes.\n",
    "    '''\n",
    "    with C.layers.default_options(init = C.layers.glorot_uniform(), activation = C.ops.relu):\n",
    "\n",
    "            # Features are the initial values.\n",
    "            hidden_out = features\n",
    "\n",
    "            # Creating some convolutional layers\n",
    "            hidden_out = C.layers.Convolution2D(filter_shape=(3, 3),\n",
    "                                       num_filters=16,\n",
    "                                       strides=(2, 2),\n",
    "                                       pad=True, name='first_conv')(hidden_out)\n",
    "            hidden_out = C.layers.Convolution2D(filter_shape=(5, 5),\n",
    "                                       num_filters=64,\n",
    "                                       strides=(2, 2),\n",
    "                                       pad=True, name='second_conv')(hidden_out)\n",
    "\n",
    "            # Last layer connected to Softmax.\n",
    "            network_output = C.layers.Dense(num_classes, activation=None, name='classify')(hidden_out)\n",
    "            return network_output\n",
    "\n",
    "# Initializing the model with normalized input.\n",
    "net_out = create_model(input/255.0)\n",
    "\n",
    "# loss and error calculations.\n",
    "loss = C.cross_entropy_with_softmax(net_out, label)\n",
    "label_error = C.classification_error(net_out, label)\n",
    "\n",
    "# Setup the trainer operator as train_op.\n",
    "learning_rate_schedule = C.learning_rate_schedule(initial_learning_rate, C.UnitType.minibatch)\n",
    "learner = C.sgd(net_out.parameters, learning_rate_schedule)\n",
    "train_op = C.Trainer(net_out, (loss, label_error), [learner])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sina/anaconda/envs/cntk-py35/lib/python3.5/site-packages/cntk/core.py:351: UserWarning: your data is of type \"float64\", but your input variable (uid \"Input3\") expects \"<class 'numpy.float32'>\". Please convert your data beforehand to speed up training.\n",
      "  (sample.dtype, var.uid, str(var.dtype)))\n",
      "/home/sina/anaconda/envs/cntk-py35/lib/python3.5/site-packages/cntk/core.py:351: UserWarning: your data is of type \"float64\", but your input variable (uid \"Input4\") expects \"<class 'numpy.float32'>\". Please convert your data beforehand to speed up training.\n",
      "  (sample.dtype, var.uid, str(var.dtype)))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minibatch: 0, Loss: 2.296, Error: 89.06%\n",
      "Minibatch: 500, Loss: 0.118, Error: 3.12%\n",
      "Minibatch: 1000, Loss: 0.048, Error: 0.00%\n",
      "Minibatch: 1500, Loss: 0.069, Error: 4.69%\n",
      "Minibatch: 2000, Loss: 0.066, Error: 3.12%\n",
      "Minibatch: 2500, Loss: 0.113, Error: 4.69%\n",
      "Minibatch: 3000, Loss: 0.019, Error: 0.00%\n",
      "Minibatch: 3500, Loss: 0.008, Error: 0.00%\n",
      "Minibatch: 4000, Loss: 0.057, Error: 3.12%\n",
      "Minibatch: 4500, Loss: 0.044, Error: 1.56%\n",
      "Minibatch: 5000, Loss: 0.024, Error: 0.00%\n",
      "Minibatch: 5500, Loss: 0.017, Error: 1.56%\n",
      "Minibatch: 6000, Loss: 0.043, Error: 1.56%\n",
      "Minibatch: 6500, Loss: 0.027, Error: 0.00%\n",
      "Minibatch: 7000, Loss: 0.001, Error: 0.00%\n",
      "Minibatch: 7500, Loss: 0.037, Error: 1.56%\n",
      "Minibatch: 8000, Loss: 0.005, Error: 0.00%\n",
      "Minibatch: 8500, Loss: 0.024, Error: 1.56%\n",
      "Minibatch: 9000, Loss: 0.012, Error: 0.00%\n"
     ]
    }
   ],
   "source": [
    "# Plot data dictionary.\n",
    "plotdata = {\"iteration\":[], \"loss\":[], \"error\":[]}\n",
    "\n",
    "# Initialize the parameters for the trainer\n",
    "num_iterations = (num_training_samples * num_epochs) / batch_size\n",
    "\n",
    "# Training loop.\n",
    "for iter in range(0, int(num_iterations)):\n",
    "\n",
    "    # Read a mini batch from the training data file\n",
    "    batch_data, batch_label = train_reader.next_batch(batch_size=batch_size)\n",
    "\n",
    "    arguments = {input: batch_data, label: batch_label}\n",
    "    train_op.train_minibatch(arguments=arguments)\n",
    "\n",
    "    if iter % train_log_iter == 0:\n",
    "\n",
    "        training_loss = False\n",
    "        evalaluation_error = False\n",
    "        training_loss = train_op.previous_minibatch_loss_average\n",
    "        evalaluation_error = train_op.previous_minibatch_evaluation_average\n",
    "        print(\"Minibatch: {0}, Loss: {1:.3f}, Error: {2:.2f}%\".format(iter, training_loss, evalaluation_error * 100))\n",
    "\n",
    "        if training_loss or evalaluation_error:\n",
    "            plotdata[\"loss\"].append(training_loss)\n",
    "            plotdata[\"error\"].append(evalaluation_error)\n",
    "            plotdata[\"iteration\"].append(iter)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n96UWxIUXwvbbr9s6H34YfvSj1Co58UQ47TTYeuvKxGtm1eGE0QteeQVuvBF+/ev0Q/m1r8G55677\neu+9F6ZMgZdeStOLL6bHH/8YPv3pNcufdRbccw/07ZumPn3S41lnwb77rln+oovg8svhySdXtRz2\n2w8OPjjdcbASnnsuJaArr0xJ9YorYP31K7NuM6ssJ4xeNm9euif4Rz6y5msLF8Lzz69KAO3TF74A\nBx64ZvkLL4Tp02HLLVefdtgBNt54zfLTp8P8+bB8+appxQr48IfT+zq6/faUGPbcM91lsJoWL07d\nd8ceW916KuXtt1PL8Z570jR2bNoR6GjaNJg5EwYPhkGDVj0OHJgStlk9qauEIWkMcD7pjKxfRMQP\ny5S5EBgLvAF8JSKmlClTWMLoyre/nX40OyaAT36yuQ+o15K//AXOOAMefRR23RUOOAA++lHYZ590\nj5SObrwRrrkGFi1KIwO0P37963D22WuWnzgx1TF8+KqppQW22qr+ujIh7Qg89xyMGpWSZEePPQbr\nrQebbQZDhqQWr9WuSiYMIqJqEylJPAWMBNYHpgC7dCgzFvhdNr8PcH8n64paM2nSpKJDKKsW4jrr\nrIizz46YNy89742YXnut/PLZsyPuuCNiyZLVl1cqpvvuizj33IhTT4347Gcj9tsvYrvtIi64oHz5\ntraIK66I+MMfIv7617SNVqyobEzdcfHFEUceGfGhD0UMGhSx8cYRu+8e8eCD5WM66aSInXeOGDo0\nok+f9J4ddoiYMqX8+idNStO0aRELFkSsXFmZuHuyrRYvjpgwIeI734k44oiIHXeM2HzziBNOKC6m\nast+Oyvym17tfYO9gVkR8TyApF8BhwMzSsocDlyVZYQHJA2UNCwi5lU5tnXW1tZGa2tr0WGsoRbi\n+tKX4Kc/hZ13Tte8zJvXxvz5rRx+OPTrt+7rX7kSnngidS3dfXd63GKL1OXU0dZblz84X6ntNHp0\nmvJ65RW48850f/m5c9Pj66/Df/83PP/8mjFdfnlqwfTvDxtuuOrxsMPScaqOnnoKXn0VFixILYVn\nn02PX/0qfOITa5YfNSp1oY4alaahQ1e/d0zH7XTZZateW7kytcAWLEgtqnJuuim17ubPT591+XIY\nOTItX5dWeGff37JlMHt2+ZM8lixJ1xnttlv6zLvtlrobFy8uX8c998B556W/49Jp+PDy99fp7t/U\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6256719278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nIAJgcl69seIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f625403eef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.plot(plotdata[\"iteration\"], plotdata[\"loss\"], 'b--')\n",
    "plt.xlabel('Minibatch number')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('iteration run vs. Training loss')\n",
    "plt.show()\n",
    "\n",
    "plt.plot(plotdata[\"iteration\"], plotdata[\"error\"], 'r--')\n",
    "plt.xlabel('Minibatch number')\n",
    "plt.ylabel('Label Prediction Error')\n",
    "plt.title('iteration run vs. Label Prediction Error')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average test error: 1.28%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sina/anaconda/envs/cntk-py35/lib/python3.5/site-packages/cntk/core.py:351: UserWarning: your data is of type \"float64\", but your input variable (uid \"Input3\") expects \"<class 'numpy.float32'>\". Please convert your data beforehand to speed up training.\n",
      "  (sample.dtype, var.uid, str(var.dtype)))\n",
      "/home/sina/anaconda/envs/cntk-py35/lib/python3.5/site-packages/cntk/core.py:351: UserWarning: your data is of type \"float64\", but your input variable (uid \"Input4\") expects \"<class 'numpy.float32'>\". Please convert your data beforehand to speed up training.\n",
      "  (sample.dtype, var.uid, str(var.dtype)))\n"
     ]
    }
   ],
   "source": [
    "# Test data.\n",
    "test_minibatch_size = 256\n",
    "num_samples = 10000\n",
    "num_batches_to_test = num_samples // test_minibatch_size\n",
    "test_error = 0.0\n",
    "\n",
    "for i in range(num_batches_to_test):\n",
    "\n",
    "    # Read a mini batch from the test data file\n",
    "    batch_data, batch_label = test_reader.next_batch(batch_size=test_minibatch_size)\n",
    "\n",
    "    # Evaluate\n",
    "    arguments = {input: batch_data, label: batch_label}\n",
    "    eval_error = train_op.test_minibatch(arguments=arguments)\n",
    "\n",
    "    # accumulate test error\n",
    "    test_error = test_error + eval_error\n",
    "\n",
    "# Calculation of average test error.\n",
    "average_test_error = test_error*100 / num_batches_to_test\n",
    "\n",
    "# Average of evaluation errors of all test minibatches\n",
    "print(\"Average test error: {0:.2f}%\".format(average_test_error))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
